/**
 * @author Silas Fontain, Søren Lorentzen, Daniel Nissen
 */

package service;

import ordination.*;
import static org.junit.Assert.*;

import java.util.GregorianCalendar;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import dao.Dao;

public class ServiceTest {

	GregorianCalendar startDen = new GregorianCalendar(1991, 04, 15);
	GregorianCalendar slutDen = new GregorianCalendar(1992, 04, 27);
	Patient p1 = new Patient("1234567890", "Søren Lorentzen", 60.0);
	Patient p2 = new Patient("1234567890", "Søren Lorentzen", 60.0);
	Patient p3 = new Patient("1234567890", "Søren Lorentzen", 60.0);
	Patient p4 = new Patient("1234567890", "Søren Lorentzen", 60.0);
	Patient p5 = new Patient("1234567890", "Søren Lorentzen", 60.0);
	Laegemiddel pinex = new Laegemiddel("Pinex", 0.1,0.15,0.16, "Styk");
	Laegemiddel fucidin = new Laegemiddel("Fucidin", 0.025, 0.025, 0.025, "Styk");
	Laegemiddel paracetamol = new Laegemiddel("Paracetamol", 1,1.5,2, "Ml");
	Laegemiddel abc = new Laegemiddel("ABC", 0.01,0.015,0.02, "Styk");
	
	Patient testPatient = new Patient("1234567890", "Søren Lorentze", 24.0);
	
	@Before
	public void setUp() throws Exception {
		
	}

	@Test
	public void testOpretPNOrdination() {
		PN ordination1 = Service.opretPNOrdination(startDen, slutDen, p1, pinex, 3);
		//Tester link
		assertSame("Patientens link er forkert.", p1.getOrdinationer().get(0), ordination1);
		
		//Tester antal Enheder på ordinationen
		assertTrue("Antal enheder er forkert.", ordination1.getAntalEnheder() == 3.0);
		
		//Tester startDato
		assertSame("Startdato er forkert.", this.startDen, ordination1.getStartDen());
		
		//Tester slutDato
		assertSame("Slutdato er forkert.", this.slutDen, ordination1.getSlutDen());
		
		//Tester lægemiddel
		assertSame("Lægemiddel er forkert.", this.pinex, ordination1.getLaegemiddel());
		
	}

	@Test
	public void testOpretDagligFastOrdination1() {
		DagligFast ordination2 = Service.opretDagligFastOrdination(startDen, slutDen, p4, fucidin, 18, 15, 25, 3);
		
		//Tester link
		assertSame("Link virker ikke.", ordination2, p4.getOrdinationer().get(0));
		
		//Tester doser 
		assertTrue("Dose 1 er forkert.", ordination2.getDoser()[0].getAntal() == 18);
		assertTrue("Dose 2 er forkert.", ordination2.getDoser()[1].getAntal() == 15);
		assertTrue("Dose 3 er forkert.", ordination2.getDoser()[2].getAntal() == 25);
		assertTrue("Dose 4 er forkert.", ordination2.getDoser()[3].getAntal() == 3);
		
		//Tester startDato
		assertSame("Startdato er forkert.", this.startDen, ordination2.getStartDen());
		
		//Tester slutDato
		assertSame("Slutdato er forkert.", this.slutDen, ordination2.getSlutDen());
		
		//Tester lægemiddel
		assertSame("Lægemiddel er forkert.", this.fucidin, ordination2.getLaegemiddel());
		
	}
	
	@Test
	public void testOpretDagligFastOrdination2() {
		DagligFast ordination2 = Service.opretDagligFastOrdination(startDen, slutDen, p5, fucidin, 18, -4, 0, 5);
		
		//Tester link
		assertSame("Link virker ikke.", ordination2, p5.getOrdinationer().get(0));
		
		//Tester doser 
		assertTrue("Dose 1 er forkert.", ordination2.getDoser()[0].getAntal() == 18);
		assertNull("Dose 2 er forkert.", ordination2.getDoser()[1] );
		assertNull("Dose 3 er forkert.", ordination2.getDoser()[2] );
		assertTrue("Dose 4 er forkert.", ordination2.getDoser()[3].getAntal() == 5);
		
		//Tester startDato
		assertSame("Startdato er forkert.", this.startDen, ordination2.getStartDen());
		
		//Tester slutDato
		assertSame("Slutdato er forkert.", this.slutDen, ordination2.getSlutDen());
		
		//Tester lægemiddel
		assertSame("Lægemiddel er forkert.", this.fucidin, ordination2.getLaegemiddel());
		
	}

	@Test
	public void testOpretDagligSkaevOrdination1() {
		String[] klokkeSlet = {"07.00", "19.00", "23.00" };
		double[] antalEnheder = { 2.0, 2.0, 3.0 };
		DagligSkaev ordination3 = Service.opretDagligSkaevOrdination(startDen, slutDen, p3, pinex, klokkeSlet, antalEnheder);
		
		//Tester link
		assertSame("Link virker ikke.", ordination3, p3.getOrdinationer().get(0));
		
		//Tester doser
		List<Dosis> doser = ordination3.getDoser();
		
		////Tester dosis 1
		assertEquals("Dosis 1 er forkert.", "07.00", doser.get(0).getTid());
		assertEquals("Dosis 1 er forkert.", 2.0, doser.get(0).getAntal(), 0);
		
		////Tester dosis 2
		assertEquals("Dosis 2 er forkert.", "19.00", doser.get(1).getTid());
		assertEquals("Dosis 2 er forkert.", 2.0, doser.get(1).getAntal(), 0);
		
		////Tester dosis 3
		assertEquals("Dosis 3 er forkert.", "23.00", doser.get(2).getTid());
		assertEquals("Dosis 3 er forkert.", 3.0, doser.get(2).getAntal(), 0);
		
		//Tester startDato
		assertSame("Startdato er forkert.", this.startDen, ordination3.getStartDen());
		
		//Tester slutDato
		assertSame("Slutdato er forkert.", this.slutDen, ordination3.getSlutDen());
		
	}
	
	@Test
	public void testOpretDagligSkaevOrdination2() {
		String[] klokkeSlet = {"04.00", "11.00", "17.00" };
		double[] antalEnheder = { 2.0, 5.0, 3.0 };
		DagligSkaev ordination3 = Service.opretDagligSkaevOrdination(startDen, slutDen, p2, paracetamol, klokkeSlet, antalEnheder);
		
		//Tester link
		assertSame("Link virker ikke.", ordination3, p2.getOrdinationer().get(0));
		
		//Tester doser
		List<Dosis> doser = ordination3.getDoser();
		
		////Tester dosis 1
		assertEquals("Dosis 1 er forkert.", "04.00", doser.get(0).getTid());
		assertEquals("Dosis 1 er forkert.", 2.0, doser.get(0).getAntal(), 0);
		
		////Tester dosis 2
		assertEquals("Dosis 2 er forkert.", "11.00", doser.get(1).getTid());
		assertEquals("Dosis 2 er forkert.", 5.0, doser.get(1).getAntal(), 0);
		
		////Tester dosis 3
		assertEquals("Dosis 3 er forkert.", "17.00", doser.get(2).getTid());
		assertEquals("Dosis 3 er forkert.", 3.0, doser.get(2).getAntal(), 0);
		
		//Tester startDato
		assertSame("Startdato er forkert.", this.startDen, ordination3.getStartDen());
		
		//Tester slutDato
		assertSame("Slutdato er forkert.", this.slutDen, ordination3.getSlutDen());
		
	}

	@Test
	public void testAnbefaletDosisPrDoegn() {
		
		//Tester vægt med 24 kilogram
		testPatient.setVaegt(24.0);
		assertEquals(2.4, Service.anbefaletDosisPrDoegn(testPatient, pinex), 0.001);
		assertEquals(24, Service.anbefaletDosisPrDoegn(testPatient, paracetamol), 0.001);
		assertEquals(0.6, Service.anbefaletDosisPrDoegn(testPatient, fucidin), 0.001);
		assertEquals(0.24, Service.anbefaletDosisPrDoegn(testPatient, abc), 0.001);
		
		
		//Tester vægt med 25 kilogram
		testPatient.setVaegt(25.0);
		assertEquals(3.75, Service.anbefaletDosisPrDoegn(testPatient, pinex), 0.001);
		assertEquals(37.5, Service.anbefaletDosisPrDoegn(testPatient, paracetamol), 0.001);
		assertEquals(0.625, Service.anbefaletDosisPrDoegn(testPatient, fucidin), 0.001);
		assertEquals(0.375, Service.anbefaletDosisPrDoegn(testPatient, abc), 0.001);
		
		//Tester vægt med 120 kilogram
		testPatient.setVaegt(120);
		assertEquals(18, Service.anbefaletDosisPrDoegn(testPatient, pinex), 0.001);
		assertEquals(180, Service.anbefaletDosisPrDoegn(testPatient, paracetamol), 0.001);
		assertEquals(3, Service.anbefaletDosisPrDoegn(testPatient, fucidin), 0.001);
		assertEquals(1.8, Service.anbefaletDosisPrDoegn(testPatient, abc), 0.001);
		
		//Tester vægt med 121 kilogram
		testPatient.setVaegt(121);
		assertEquals(19.36, Service.anbefaletDosisPrDoegn(testPatient, pinex), 0.001);
		assertEquals(242, Service.anbefaletDosisPrDoegn(testPatient, paracetamol), 0.001);
		assertEquals(3.025, Service.anbefaletDosisPrDoegn(testPatient, fucidin), 0.001);
		assertEquals(2.42, Service.anbefaletDosisPrDoegn(testPatient, abc), 0.001);
		
		//Tester vægt med 36217 kilogram
		testPatient.setVaegt(36217.0);
		assertEquals(5794.72, Service.anbefaletDosisPrDoegn(testPatient, pinex), 0.001);
		assertEquals(72434, Service.anbefaletDosisPrDoegn(testPatient, paracetamol), 0.001);
		assertEquals(905.425, Service.anbefaletDosisPrDoegn(testPatient, fucidin), 0.001);
		assertEquals(724.34, Service.anbefaletDosisPrDoegn(testPatient, abc), 0.001);
	}

}
